package root.WeightedRoundRobinScheduling;

import java.util.LinkedList;
import java.util.Queue;

public class WeightedRoundRobinScheduler {
    private Queue<Process> queue;  // 进程队列
    private int timeQuantum;       // 基本时间片大小

    public WeightedRoundRobinScheduler(int timeQuantum) {
        this.timeQuantum = timeQuantum;
        this.queue = new LinkedList<>();
    }

    public void addProcess(Process process) {
        queue.add(process);
    }

    public void run() {
        while (!queue.isEmpty()) {
            Process process = queue.poll();  // 获取队列中的进程
            int actualTime = process.weight * timeQuantum;  // 进程的实际执行时间

            // 判断进程是否能在当前时间片内完成
            if (process.remainingTime > actualTime) {
                process.remainingTime -= actualTime;  // 执行时间
                System.out.println("Process " + process.id + " executed for " + actualTime + " units. Remaining time: " + process.remainingTime);
                queue.add(process);  // 执行不完，重新加入队列
            } else {
                System.out.println("Process " + process.id + " finished execution.");
                process.remainingTime = 0;  // 进程执行完毕
            }
        }
    }

    public static void main(String[] args) {
        WeightedRoundRobinScheduler scheduler = new WeightedRoundRobinScheduler(4);  // 基本时间片大小为 4

        // 添加进程（进程ID, 总执行时间, 权重）
        scheduler.addProcess(new Process(1, 10, 2));  // 权重为2的进程
        scheduler.addProcess(new Process(2, 5, 1));   // 权重为1的进程
        scheduler.addProcess(new Process(3, 8, 3));   // 权重为3的进程

        // 执行调度
        scheduler.run();
    }
}
/*
加权轮转调度（Weighted Round-Robin Scheduling，简称 WRR）算法是轮转调度算法的一个扩展。与标准的轮转调度不同，加权轮转调度根据每个进程的权重来分配 CPU 时间，权重越大的进程会得到更多的执行时间。

加权轮转调度的原理：
每个进程有一个权重（Weight），而不是统一的时间片。
每个进程的实际执行时间为：权重 * 时间片。
权重较大的进程会占用更多的 CPU 时间，而权重较小的进程则占用较少的 CPU 时间。
加权轮转调度算法步骤：
为每个进程分配一个权重。
每个进程按照其权重来分配 CPU 时间。
如果进程执行完毕，移除进程；如果未执行完毕，则返回队列，等待下次执行。
*/